package modelo;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class UsuarioTableModel extends AbstractTableModel {

    private static final long serialVersionUID = 1L;
    
    /* Lista de Cliente que representam as linhas. */
    private List<Usuario> linhas;

    private List<Usuario> linhasAux;
    
    /* Array de Strings com o nome das colunas. */
    private String[] colunas = new String[] {
        "Nome","Login", "Senha","Tipo de Usuário" 
    };

    /* Cria um ClienteTableModel vazio. */
    public UsuarioTableModel() {
        linhas = new ArrayList<Usuario>();
        linhasAux = new ArrayList<Usuario>();
    }

    /* Cria um ClienteTableModel carregado com
     * a lista de Cliente especificada. */
    public UsuarioTableModel(List<Usuario> listaDeUsuario) {
        linhas = new ArrayList<Usuario>(listaDeUsuario);
    }


    /* Retorna a quantidade de colunas. */
    @Override
    public int getColumnCount() {
        // EstÃ¡ retornando o tamanho do array "colunas".
        return colunas.length;
    }

    /* Retorna a quantidade de linhas. */
    @Override
    public int getRowCount() {
        // Retorna o tamanho da lista de Cliente.
        return linhas.size();
    }


    @Override
    public String getColumnName(int columnIndex) {
        // Retorna o conteÃºdo do Array que possui o nome das colunas
        return colunas[columnIndex];
    } 

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return String.class;
    }
  
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
            Usuario usuario = linhas.get(rowIndex);

        // Retorna o campo referente a coluna especificada.
        // Aqui é feito um switch para verificar qual é a coluna
        // e retornar o campo adequado. As colunas sãoas mesmas
        // que foram especificadas no array "colunas".
        switch (columnIndex) {

            // Seguindo o exemplo: "Tipo","Data de Cadastro", "Nome", "Idade"};
            case 0:
                return usuario.getNome();
            case 1:
                return usuario.getLogin();
            case 2:
                return usuario.getSenha();
            case 3:
                return usuario.getTipo();
            default:
                // Isto não deveria acontecer...
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

    @Override
    //modifica na linha e coluna especificada
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Usuario usuario = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado

        switch (columnIndex) { // Seta o valor do campo respectivo
            case 0:
                usuario.setNome(aValue.toString());
            case 1:
                usuario.setLogin(aValue.toString());
            case 2:
                usuario.setSenha(aValue.toString());
            case 3:
                usuario.setTipo(aValue.toString());
            default:
             // Isto não deveria acontecer...             
        }
        fireTableCellUpdated(rowIndex, columnIndex);
     }

    //modifica na linha especificada
    public void setValueAt(Usuario aValue, int rowIndex) {
        Usuario usuario = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado

        usuario.setNome(aValue.getNome());
        usuario.setLogin(aValue.getLogin());
        usuario.setSenha(aValue.getSenha());
        usuario.setTipo(aValue.getTipo());
        
        fireTableCellUpdated(rowIndex, 0);
        fireTableCellUpdated(rowIndex, 1);
        fireTableCellUpdated(rowIndex, 2);
        fireTableCellUpdated(rowIndex, 3);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }        

    public Usuario getUsuario(int indiceLinha) {
        return linhas.get(indiceLinha);
    }


    /* Adiciona um registro. */
    public void addUsuario(Usuario usuario) {
        // Adiciona o registro.
        linhas.add(usuario);


        int ultimoIndice = getRowCount() - 1;

        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    /* Remove a linha especificada. */
    public Usuario removeUsuario(int indiceLinha) {
        Usuario usuario = linhas.remove(indiceLinha);
        fireTableRowsDeleted(indiceLinha, indiceLinha);
        return usuario;
    }

    /* Adiciona uma lista de Cliente ao final dos registros. */
    public void addListaDeUsuario(List<Usuario> usuario) {
        // Pega o tamanho antigo da tabela.
        int tamanhoAntigo = getRowCount();

        // Adiciona os registros.
        linhas.addAll(usuario);

        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
    }
    
    public void atualizarUsuario(Usuario usuario) {
        for (int i=0;i<linhas.size();i++) {
            if (linhas.get(i).getId() == usuario.getId()) {
                
                linhas.get(i).setNome(usuario.getNome());
                linhas.get(i).setLogin(usuario.getLogin());
                linhas.get(i).setSenha(usuario.getSenha());
                linhas.get(i).setTipo(usuario.getTipo());
                
                fireTableRowsUpdated(i, i);
            }
        }        
    }
    
    public void atualizarModelo(List<Usuario> listaDeUsuario ) {
        limpar();
        addListaDeUsuario(listaDeUsuario);
    }

    /* Remove todos os registros. */
    public void limpar() {
        linhas.clear();

        fireTableDataChanged();
    }

    /* Verifica se este table model esta vazio. */
    public boolean isEmpty() {
        return linhas.isEmpty();
    }
    
    
}